table of contents
SUBPAGE_PROT(2) | Руководство программиста Linux | SUBPAGE_PROT(2) |
ИМЯ¶
subpage_prot - определяет подстраничную защиту адресного диапазона
ОБЗОР¶
long subpage_prot(unsigned long addr, unsigned long len, uint32_t *map);
ОПИСАНИЕ¶
Системный вызов (есть только для PowerPC) subpage_prot() предоставляет возможность контроля доступа к отдельным 4КБ подстраницам в системах, где размер страницы равен 64КБ.
Карта защиты налагается на страницы памяти для области, начинающейся с addr и имеющей размер len байт. Значения обоих аргументов должны быть выровнены на 64-КБ границу.
Карта защиты задаётся в буфере, на который указывает map. В карте на каждую 4-килобайтную подстраницу выделяется 2 бита; таким образом, в каждом 32-битном слове задаётся защита для 16 4-килобайтных подстраниц внутри 64-килобайтной страницы (поэтому количество 32-битных слов, на которые указывает map, должно быть равно количеству 64-килобайтных страниц, указанному в len). Каждое 2-битное поле в карте защиты может быть: 0 — полный доступ, 1 — защита от записи, 2 или 3 — запрет на любой доступ.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
При успешном выполнении subpage_prot() возвращается 0. В противном случае возвращается один из кодов ошибок, описанных далее.
ОШИБКИ¶
- EFAULT
- Буфер, на который ссылается map, недоступен.
- EINVAL
- Некорректное значение аргумента addr или len. Оба значения должны быть кратны размеру системной страницы, и они не должны указывать на область вне адресного пространства процесса, или на область, которая состоит из огромных страниц.
- ENOMEM
- Не хватает памяти.
ВЕРСИИ¶
Данный системный вызов предоставляется для архитектуры PowerPC начиная с Linux 2.6.25. Для его сборки в ядре должен быть указан параметр CONFIG_PPC_64K_PAGES. В библиотеке поддержка данного вызова отсутствует.
СООТВЕТСТВИЕ СТАНДАРТАМ¶
Данный вызов есть только в Linux.
ЗАМЕЧАНИЯ¶
Обычная страничная защита также работает (на уровне 64-килобайтных страниц); механизм подстраничной защиты является дополнительным ограничением, поэтому указание 0 в 2-битном поле не разрешит запись в страницу, которая защищена от записи другим способом.
Обоснование¶
Данный системный вызов предоставляется для облегчения написания эмуляторов, которые работают с 64-КБ страницами в системах PowerPC. При эмуляции систем, в которых используется меньший размер страницы (таких как x86), эмулятор не может использовать блок управления памятью (MMU) и обычные системные вызовы управления защитой страниц (эмулятор может эмулировать MMU с помощью ПО проверяя и, возможно, перераспределяя адрес при каждом обращении к памяти, но это медленно). Идея в том, что эмулятор задаёт массив защитных масок для указанного диапазона виртуальных адресов. Эти маски накладываются в месте, где аппаратные табличные записи страниц (PTE) вставляются в аппаратную таблицу страниц на основе Linux PTE, при этом Linux PTE не затрагиваются. В этом случае для защищённых областей адресного пространства начинают неявно использоваться 4-килобайтные аппаратные страницы, а не 64-килобайтные аппаратные страницы (на машинах с аппаратной поддержкой 64-килобайтных страниц).
СМОТРИТЕ ТАКЖЕ¶
mprotect(2), syscall(2);
Файл из
дерева
исходного
кода ядра
Documentation/vm/hugetlbpage.txt.
2010-10-30 | Linux |